ggplot2ggplot2ggplot2 ao tidyverseggplot2## var1 var2 x y
## 1 a fechado 2.0 1.0
## 2 b fechado 3.0 1.5
## 3 a fechado 2.5 1.4
## 4 b aberto 5.0 4.2
## 5 a aberto 6.0 4.0
## 6 b aberto 5.5 4.6
“Resumidamente, a gramática nos diz que um gráfico deve ser mapeado (mapping) a partir dos dados (data), de acordo com a aparência (aesthetic; color, formato, tamanho) de objetos geométricos (geometric; pontos, linhas, barras). A figura também pode conter transformações estatísticas dos dados, sendo desenhada a partir de um sistema específico de coordenadas.” (Do livro “ggplot2”)
lattice);base);lattice e base).ggplot2base e lattice.ggplot2 ou através do tidyverse.# uma forma de carregar o ggplot2 e mais todos os pacotes de manipulação e limpeza de dados
library(tidyverse)
# outra opção, mas só carrega o ggplot2!
library(ggplot2)
ilhas.xlsx, e atribua esta tabela ao objeto ilhas.dados dos projetos.csv) e atribua estes dados ao objeto dados.ggplot2 começa da mesma forma: através da função ggplot().ggplot(data = ilhas, mapping = aes(x = area, y = riqueza))
+ ao final da linha.ggplot(data = ilhas, mapping = aes(x = area, y = riqueza)) +
geom_point()
ggplot2 permite que adicionemos transformações às variáveis que estamos mapeando.ggplot(data = ilhas, mapping = aes(x = log(area), y = log(riqueza))) +
geom_point()
ggplot(data = ilhas, mapping = aes(x = area, y = riqueza)) +
geom_point() +
scale_x_continuous(trans = "log") +
scale_y_continuous(trans = "log")
geom_ e apertando o tab, e selecione aquela representação que melhor ilustra a relação entre uma variável contínua e uma categórica).ggplot(data = ilhas, mapping = aes(x = area, y = riqueza)) +
geom_point() +
geom_smooth(method = "lm") +
scale_x_continuous(trans = "log") +
scale_y_continuous(trans = "log")
ggplot(data = ilhas, mapping = aes(x = area, y = riqueza)) +
geom_smooth(method = "lm") +
geom_point() +
scale_x_continuous(trans = "log") +
scale_y_continuous(trans = "log")
ggplot2ggplot2 é começando através de um gráfico em branco, e ir adicionando as informações que queremos mapear camada a camada.ggplot()
ggplot() +
geom_point(data = ilhas, mapping = aes(x = area, y = riqueza))
ggplot() +
geom_point(data = ilhas, mapping = aes(x = area, y = riqueza)) +
geom_smooth(data = ilhas, mapping = aes(x = area, y = riqueza), method = "lm") +
scale_x_continuous(trans = "log") +
scale_y_continuous(trans = "log")
ggplot(data = ilhas) +
geom_point(data = ilhas, mapping = aes(x = area, y = riqueza)) +
geom_smooth(data = ilhas, mapping = aes(x = area, y = riqueza), method = "lm") +
scale_x_continuous(trans = "log") +
scale_y_continuous(trans = "log")
ggplot2, que podemos usar ao nosso favor dependendo do objetivo e dados que temos:
ggplot: útil quando todas as informações que irão para cada geom estão dentro de uma mesma tabela.geom: útil quando cada geom representa informações presentes em conjunto de dados diferentes.ggplot: útil quando toda a figura é feita com referência àquela unidade estética vinda daquele conjunto de dados.ggplot2 objeto-a-objetoggplot2: podemos criar uma camada, atribuir ela a um objeto, adicionar mais uma camada a esse objeto e sobre-escrevelo, e assim sucessivamente.figura <- ggplot(data = ilhas, mapping = aes(x = area, y = riqueza))
figura
figura <- figura +
geom_point()
figura
figura <- figura +
geom_smooth(method = "lm") +
scale_x_continuous(trans = "log") +
scale_y_continuous(trans = "log")
figura
ggplot2base e no lattice, também podemos modificar o tamanho (size), formato (shape), cor da borda (color), preenchimento (fill), grossura da linha dos símbolos (stroke) e das linhas (size), tipo de linhas (linetype) de cada geom.ggplot(data = ilhas, mapping = aes(x = log(area), y = log(riqueza))) +
geom_point(size = 4)
ggplot(data = ilhas, mapping = aes(x = log(area), y = log(riqueza))) +
geom_point(size = 4, shape = 21)
ggplot(data = ilhas, mapping = aes(x = log(area), y = log(riqueza))) +
geom_point(size = 4, shape = 21, fill = "grey50")
ggplot(data = ilhas, mapping = aes(x = log(area), y = log(riqueza))) +
geom_point(size = 4, shape = 21, fill = "grey50", colour = "blue3")
ggplot(data = ilhas, mapping = aes(x = log(area), y = log(riqueza))) +
geom_point(size = 4, shape = 21, fill = "grey50", colour = "blue3", stroke = 2)
ggplot(data = ilhas, mapping = aes(x = log(area), y = log(riqueza))) +
geom_point(size = 4, shape = 21, fill = "grey50", colour = "blue3", stroke = 2, alpha = 0.4)
shape quanto outros aspectos gráficos como o linetype, color e fill seguem os mesmos padrões de valores existentes na base do R.
shape: linetype: colour e fill:
RColorBrewer: viridis: shape + color + fill. Dos shapes 0 ao 14 podemos controlar apenas a cor da borda, através do argumento colour; por outro lado, dos shapes 15 ao 20, o colour controla o preenchimento da figura geométrica; finalmente, nos shapes 21 ao 25 temos que o colour controla a cor da borda enquanto o fill controla o preenchimento da figura geométrica. O padrão do ggplot2 é usar o shape = 16 - por isso quando usamos o colour aqui temos a modificação do preenchimento da figura geométrica.ggplot(data = ilhas, mapping = aes(x = log(area), y = log(riqueza), colour = ilha)) +
geom_point()
# outra forma de fazer isso
ggplot(data = ilhas, mapping = aes(x = log(area), y = log(riqueza))) +
geom_point(mapping = aes(colour = ilha))
# e mais uma forma
ggplot() +
geom_point(data = ilhas, mapping = aes(x = log(area), y = log(riqueza), colour = ilha))
mapping!
geom_point(mapping = aes(colour = ilha)) vs geom_point(colour = ilha)geom_point(mapping = aes(colour = ilha)) vs geom_point(mapping = aes(colour = "ilha"))ggplot(data = ilhas, mapping = aes(x = log(area), y = log(riqueza),
colour = ilha, shape = arquipelago, size = produtividade)) +
geom_point()
ggplot() +
geom_point(data = ilhas, mapping = aes(x = log(area), y = log(riqueza), colour = ilha),
colour = "blue3")
ggplot2 que queremos mapear certas características a alguns elementos estéticos de uma figura. Além disso, uma vez que estes elementos estejam mapeados, podemos customizar também a forma pela qual eles são representados. Isto é, customizamos a customização de uma figura através da alteração de suas escalas.scale_x_?: modifica as opções de apresentação do eixo x;scale_y_?: modifica as opções de apresentação do eixo y;scale_fill_?: modifica o preenchimento do objeto (fill) de forma determinada pelo usuário;scale_colour_?: modifica a cor dos pontos ou das bordas do objeto geométrico (colour) de forma determinada pelo usuário;scale_shape_?: modifica o formato dos pontos (shape) de forma determinada pelo usuário;scale_size_?: modifica o tamanho dos pontos (size) de forma determinada pelo usuário;scale_alpha_?: modifica a transparência (alpha) de forma determinada pelo usuário;scale_linetype_?: modifica o tipo de linha (linetype) de forma determinada pelo usuário.# adicionando um título aos eixos x e y, modificando a posição das legendas dos eixos e editando o texto das legendas
ggplot(data = ilhas, mapping = aes(x = log(area), y = log(riqueza))) +
geom_point(mapping = aes(colour = ilha, shape = arquipelago, size = log(produtividade))) +
scale_y_continuous(name = "Riqueza de Especies (log)", breaks = seq(from = 1, to = 4, by = 1)) +
scale_x_continuous(name = "Area (km2, log)", breaks = seq(from = -4, to = 12, by = 2), labels = c(-4, "", 0, "", 4, "", 8, "", 12))
# fornecendo o nome de duas cores para preencher as figuras geométricas, mapeados ao tipo de ilha
ggplot(data = ilhas, mapping = aes(x = log(area), y = log(riqueza))) +
geom_point(mapping = aes(colour = ilha, shape = arquipelago, size = log(produtividade))) +
scale_y_continuous(name = "Riqueza de Especies (log)", breaks = seq(from = 1, to = 4, by = 1)) +
scale_x_continuous(name = "Area (km2, log)", breaks = seq(from = -4, to = 12, by = 2), labels = c(-4, "", 0, "", 4, "", 8, "", 12)) +
scale_colour_manual(values = c("indianred3", "deepskyblue3"))
# fornecendo o código para três novos formatos de figuras geométricas, mapeados ao tipo de arquipelago
ggplot(data = ilhas, mapping = aes(x = log(area), y = log(riqueza))) +
geom_point(mapping = aes(colour = ilha, shape = arquipelago, size = log(produtividade))) +
scale_y_continuous(name = "Riqueza de Especies (log)", breaks = seq(from = 1, to = 4, by = 1)) +
scale_x_continuous(name = "Area (km2, log)", breaks = seq(from = -4, to = 12, by = 2), labels = c(-4, "", 0, "", 4, "", 8, "", 12)) +
scale_colour_manual(values = c("indianred3", "deepskyblue3")) +
scale_shape_manual(values = c(18, 15, 17))
# fornecendo o código para três novos formatos de figuras geométricas, mapeados ao tipo de arquipelago
ggplot(data = ilhas, mapping = aes(x = log(area), y = log(riqueza))) +
geom_point(mapping = aes(colour = ilha, shape = arquipelago, size = log(produtividade))) +
scale_y_continuous(name = "Riqueza de Especies (log)", breaks = seq(from = 1, to = 4, by = 1)) +
scale_x_continuous(name = "Area (km2, log)", breaks = seq(from = -4, to = 12, by = 2), labels = c(-4, "", 0, "", 4, "", 8, "", 12)) +
scale_colour_manual(values = c("indianred3", "deepskyblue3")) +
scale_shape_manual(values = c(18, 15, 17)) +
scale_size_continuous(range = c(1, 10))
# fornecendo os limites de tamanho que os pontos podem assumir
ggplot(data = ilhas, mapping = aes(x = log(area), y = log(riqueza))) +
geom_point(mapping = aes(colour = ilha, shape = arquipelago, size = log(produtividade))) +
scale_y_continuous(name = "Riqueza de Especies (log)", breaks = seq(from = 1, to = 4, by = 1)) +
scale_x_continuous(name = "Area (km2, log)", breaks = seq(from = -4, to = 12, by = 2), labels = c(-4, "", 0, "", 4, "", 8, "", 12)) +
scale_colour_manual(values = c("indianred3", "deepskyblue3")) +
scale_shape_manual(values = c(18, 15, 17)) +
scale_size_continuous(range = c(1, 10))
–
ggplot2 é esse fundo cinza e grids, que são legais para explorar visualmente os dados, mas são péssimos para uma publicação.ggplot2 são o tema dele, sendo controlados por uma função de mesmo nome - theme.ggplot2.## colocando a figura criada em um objeto
figura <- ggplot(data = ilhas, mapping = aes(x = log(area), y = log(riqueza))) +
geom_point(mapping = aes(colour = ilha, shape = arquipelago, size = log(produtividade))) +
scale_y_continuous(name = "Riqueza de Especies (log)", breaks = seq(from = 1, to = 4, by = 1)) +
scale_x_continuous(name = "Area (km2, log)", breaks = seq(from = -4, to = 12, by = 2), labels = c(-4, "", 0, "", 4, "", 8, "", 12)) +
scale_colour_manual(values = c("indianred3", "deepskyblue3")) +
scale_shape_manual(values = c(18, 15, 17)) +
scale_size_continuous(range = c(1, 10))
figura
# adicionando o tema preto-e-branco disponível no pacote do ggplot2
figura +
theme_bw()
# testando um tema mais clássico
figura +
theme_classic()
ggthemes.# carregando o pacote
library(ggthemes)
# utilizando um tema similar aquele que obteríamos caso tivéssemos criado uma figura utilizando a base do R
figura +
theme_base()
# um tema que imita o formato do Excel
figura +
theme_excel_new()
ggplot2, o ideal é sempre personalizarmos aquilo que estamos desenhando. Para modificar o tema desta forma, precisamos modificar os padrões de valores que existe dentro da função theme, adicionando esta camada de personalização à nossa figura.# removendo a legenda da figura
figura +
theme(legend.position = "none")
element_text: elementos textuais;element_rect: elementos que têm a forma de um retângulo;element_line: elementos que têm a forma de linha;element_blank: suprime uma opção.# removendo os grids do painel
figura +
theme(legend.position = "none",
panel.grid = element_blank())
# removendo o plano de fundo do painel
figura +
theme(legend.position = "none",
panel.grid = element_blank(),
panel.background = element_blank())
# adicionando linhas aos eixos x e y
figura +
theme(legend.position = "none",
panel.grid = element_blank(),
panel.background = element_blank(),
axis.line = element_line(colour = "black"))
# modificando o texto dos eixos
figura +
theme(legend.position = "none",
panel.grid = element_blank(),
panel.background = element_blank(),
axis.line = element_line(colour = "black"),
axis.text = element_text(colour = "black", size = 12))
# modificando o título dos eixos
figura +
theme(legend.position = "none",
panel.grid = element_blank(),
panel.background = element_blank(),
axis.line = element_line(colour = "black"),
axis.text = element_text(colour = "black", size = 12),
axis.title = element_text(colour = "black", size = 14, face = "bold"))
theme. Note então que uma vez definida as linhas de código que descrevem o tema para uma figura do ggplot2 basta utilizá-la para a criação de novas figuras. Existem duas formas de fazer isso:
# colocando todas as características do tema de uma figura dentro de um objeto
meu_tema <- theme(legend.position = "none",
panel.grid = element_blank(),
panel.background = element_blank(),
axis.line = element_line(colour = "black"),
axis.text = element_text(colour = "black", size = 12),
axis.title = element_text(colour = "black", size = 14, face = "bold"))
# adicionando esta cama à figura que estamos criando
figura <- figura +
meu_tema
figura
–
ggplot2 ao tidyverseggplot2 faz parte do tidyverse, podemos integrar as funções de outros pacotes e o resultado de suas operações para gerar uma figura. Inclusive, podemos utilizar o operador pipe(%>%) para passar o resultado das funções do tidyverse para o ggplot2.group_by + summarise.# qual a riqueza de espécies média e o erro associado a essa estimativa de acordo com tipo de ilha
ilhas %>%
group_by(ilha) %>%
summarise(media = mean(riqueza), desvio = sd(riqueza),
observacoes = n(), erro_padrao = desvio/observacoes)
## # A tibble: 2 x 5
## ilha media desvio observacoes erro_padrao
## <chr> <dbl> <dbl> <int> <dbl>
## 1 costeira 29.5 10.8 40 0.270
## 2 oceanica 15.4 16.5 40 0.413
# gerando uma figura que represente esta diferença a partir do resultado do processamento
ilhas %>%
group_by(ilha) %>%
summarise(media = mean(riqueza), desvio = sd(riqueza),
observacoes = n(), erro_padrao = desvio/observacoes) %>%
ggplot(mapping = aes(x = ilha, y = media, fill = ilha)) +
geom_bar(stat = "identity", colour = "black") +
geom_errorbar(mapping = aes(ymin = media - erro_padrao, ymax = media + erro_padrao),
stat = "identity", colour = "black", width = 0.5) +
meu_tema
ggplot2 ao processamento de outras funções através do pipe não precisamos especificar o argumento data dentro da chamada do ggplot, uma vez que estamos passando para ele um conjunto de dados. Isto é, ele entende que o que quer que será desenhado vêm do conjunto de dados que estamos fornecendo;%>% até iniciar a função ggplot; a partir daí, utilizamos o + para adicionar cada camada - é comum nos enganarmos e tentar usar o %>% para tudo;stat = identity tanto na chamada da função geom_bar quanto na chamada da função geom_errorbar.ggplot que desenhará essa informação que a posição de cada nível deve estar deslocada.# calculando o sumario estatistico para cada nivel do tipo de ilha e do tamanho do arquipelago
ilhas %>%
group_by(ilha, arquipelago) %>%
summarise(media = mean(riqueza), desvio = sd(riqueza),
observacoes = n(), erro_padrao = desvio/observacoes)
## # A tibble: 6 x 6
## # Groups: ilha [?]
## ilha arquipelago media desvio observacoes erro_padrao
## <chr> <chr> <dbl> <dbl> <int> <dbl>
## 1 costeira grande 41.5 7.69 6 1.28
## 2 costeira medio 30.0 9.73 26 0.374
## 3 costeira pequeno 18.9 3.91 8 0.488
## 4 oceanica grande 25.4 23.1 14 1.65
## 5 oceanica medio 12.5 9.56 14 0.683
## 6 oceanica pequeno 7.17 4.34 12 0.362
# gerando uma figura que represente esta diferença entre os dois níveis a partir do resultado do processamento
ilhas %>%
group_by(ilha, arquipelago) %>%
summarise(media = mean(riqueza), desvio = sd(riqueza),
observacoes = n(), erro_padrao = desvio/observacoes) %>%
ggplot(mapping = aes(x = arquipelago, y = media, fill = ilha)) +
geom_errorbar(mapping = aes(ymin = media - erro_padrao, ymax = media + erro_padrao),
stat = "identity", colour = "black", width = 0.5, position = position_dodge(width = 0.4)) +
geom_point(stat = "identity", colour = "black", shape = 21, size = 6, position = position_dodge(width = 0.4)) +
meu_tema
# mesmo exemplo anterior, mas para um gráfico de barras
ilhas %>%
group_by(ilha, arquipelago) %>%
summarise(media = mean(riqueza), desvio = sd(riqueza),
observacoes = n(), erro_padrao = desvio/observacoes) %>%
ggplot(mapping = aes(x = arquipelago, y = media, fill = ilha)) +
geom_bar(stat = "identity", colour = "black", position = "dodge2") +
geom_errorbar(mapping = aes(ymin = media - erro_padrao, ymax = media + erro_padrao),
stat = "identity", colour = "black", width = 0.5, position = position_dodge(width = 0.9)) +
meu_tema
–
ggplot2 dispõem de duas funções para facilitar a nossa vida para a criação de múltiplos painéis, que são entendidos como as facetas de um conjunto de dados que queremos apresentar. Estas duas funções são:
facet_wrap:muito flexível, mas visualmente menos clara.facet_grid: pouco flexível, mas visualmente mais clara.# recriando a figura da regressão que trabalhamos durante a aula
figura <- ggplot(data = ilhas, mapping = aes(x = log(area), y = log(riqueza))) +
geom_point(mapping = aes(colour = ilha, shape = arquipelago, size = log(produtividade))) +
scale_y_continuous(name = "Riqueza de Especies (log)",
breaks = seq(from = 1, to = 4, by = 1)) +
scale_x_continuous(name = "Area (km2, log)",
breaks = seq(from = -4, to = 12, by = 2),
labels = c(-4, "", 0, "", 4, "", 8, "", 12)) +
scale_colour_manual(values = c("indianred3", "deepskyblue3")) +
scale_shape_manual(values = c(18, 15, 17)) +
scale_size_continuous(range = c(1, 10)) +
theme_bw()
figura
# funcionalmente similares
figura +
facet_wrap(~ ilha)
figura +
facet_grid(~ ilha)
# totalmente diferentes
figura +
facet_wrap(arquipelago ~ ilha)
figura +
facet_grid(arquipelago ~ ilha)
ggplot2 faz aqui é simplesmente replicar cada painel e dividir os dados de acordo com a combinação dos níveis das variáveis que definem as facetas. Portanto, é como se cada painel fosse uma réplica dos demais. Uma implicação disso é que é difícil adicionar informações, como um texto, a um único painel (apesar de existirem caminhos alternativos para conseguirmos fazer isso, mas um bocado trabalhasos).# anotando um texto em um painel
figura +
facet_grid(arquipelago ~ ilha) +
annotate(geom = "text", x = 4, y = 1.5, label = "Ola")
grid.arrange do pacote gridExtra.# um painel
figA <- ilhas %>%
filter(ilha == "costeira") %>%
ggplot(mapping = aes(x = log(area), y = log(riqueza))) +
geom_point(mapping = aes(colour = ilha, shape = arquipelago, size = log(produtividade))) +
scale_y_continuous(name = "Riqueza de Especies (log)",
breaks = seq(from = 1, to = 4, by = 1),
limits = c(1, 4.7)) +
scale_x_continuous(name = "Area (km2, log)",
breaks = seq(from = -4, to = 12, by = 2),
labels = c(-4, "", 0, "", 4, "", 8, "", 12)) +
scale_colour_manual(values = c("indianred3")) +
scale_shape_manual(values = c(18, 15, 17)) +
scale_size_continuous(range = c(1, 10)) +
theme_bw() +
theme(legend.position = "none") +
annotate(geom = "text", x = -3.5, y = 4.5, label = "(a)")
# outro painel
figB <- ilhas %>%
filter(ilha == "oceanica") %>%
ggplot(mapping = aes(x = log(area), y = log(riqueza))) +
geom_point(mapping = aes(colour = ilha, shape = arquipelago, size = log(produtividade))) +
scale_y_continuous(name = "Riqueza de Especies (log)",
breaks = seq(from = 1, to = 4, by = 1),
limits = c(1, 4.7)) +
scale_x_continuous(name = "Area (km2, log)",
breaks = seq(from = -4, to = 12, by = 2),
labels = c(-4, "", 0, "", 4, "", 8, "", 12)) +
scale_colour_manual(values = c("deepskyblue")) +
scale_shape_manual(values = c(18, 15, 17)) +
scale_size_continuous(range = c(1, 10)) +
theme_bw() +
theme(legend.position = "none") +
annotate(geom = "text", x = -3.5, y = 4.5, label = "(b)")
# carregando o pacote grid e criando figura
library(gridExtra)
grid.arrange(figA, figB, ncol = 2)
ggplot2ggplot2 utilizando a função ggsave, o que garante que ela terá uma boa qualidade visual final.base do R, é muito provável que você tenha que ‘encontrar’ o melhor conjunto de valores para a expessura de linhas, tamanho dos pontos e do texto que gere a figura do tamanho final correto para uma dada qualidade (dpi).
ggsave(filename = "especie_area.png", # nome/diretorio onde a figura será salva
plot = figura, # objeto que contém a figura que você quer exportar
width = 80, height = 80, units = "mm", # tamanho final da figura
dpi = 150 # qualidade da imagem
)
ggplot2